#include <iostream>

// 函数重载和运算符重载属于静态多态
// 动态多态：派生类和虚函数

class Animal
{
public:
    virtual void speak()
    {
        std::cout << "animal is speaking" << std::endl;
    }
};

class Cat : public Animal
{
public:
    void speak()
    {
        std::cout << "cat is speaking" << std::endl;
    }
};

class Dog : public Animal
{
public:
    void speak()
    {
        std::cout << "dog is speaking" << std::endl;
    }
};

// 执行说话的函数
// 如果传递的是 Animal 类，那么调用 Animal 类的 speak 函数
// 如果传递的是 Cat 类，那么调用 Cat 类的 speak 函数
// 想让猫说话，函数地址不能提前绑定
void doSpeak(Animal& animal)    // 引用传递 Animal &animal = cat;
{
    animal.speak();
}

void test01()
{
    Cat cat;
    doSpeak(cat);

    Dog dog;
    doSpeak(dog);
}


int main()
{
    test01();
    return 0;
}